Ukladani NULL hodnot do databaze pri prazdnem TDBEdit poli

Otázka od: Tomas Bradle

11. 5. 2004 22:54

Zdravim vsechny,

mam tu jeste jeden problemek. Mam TDBEdit komponenty napojene na TIBDataset.
V pripade editovani, kdyz se text z TDBEdit uplne vymaze (predtim tam nejaky
byl), nasledny POST ulozi do databaze hodnotu NULL. Jedna se o hodnotu typu
varchar.

Nevi nekdo jak tohle nejak jednoduse vyresit ?

diky

Tomas Bradle
t.bradle@worldonline.cz



Odpovedá: Lebeda David

12. 5. 2004 9:54

> mam tu jeste jeden problemek. Mam TDBEdit komponenty napojene na
> TIBDataset. V pripade editovani, kdyz se text z TDBEdit uplne vymaze
> (predtim tam nejaky byl), nasledny POST ulozi do databaze hodnotu
> NULL. Jedna se o hodnotu typu varchar.
>
> Nevi nekdo jak tohle nejak jednoduse vyresit ?

Ahoj,

to je asi dalsi z duvodu, proc k temhle vecem nepouzivat DBEdity. No ale zkusim

poradit tip - nevim, zda pomuze. Kdyz jsem se kdysi vrtal v TIBDatasetu, zdalo
se mi,
ze pro IB je zaveden novy typ fieldu pro retezce. Normalne se pouziva
TStringField. IBX
zavadi i typ TIBStringField a ten mozna zavadi to chovani, ktere popisujes.
Zkusil bych
tedy namisto IBStringFieldu pouzit StringField. Nebo se podivat do zdrojaku
IBX, zda
nekecam.

David Lebeda

Odpovedá: Tomas Bradle

12. 5. 2004 16:34

Tak jsem to predelal bez TDBEditu a vysledek je stejny: prazdny retezec v
TIBStringField znamena NULL v databazi. Data prirazuju normalne stylem

dsTest.insert;
dsTestPRIJMENI.AsString:='Novak';
dsTest.post;

Pro TIBTabel i pro TIBDataset. Jedine co napise spravne prazdny retezec do
databaze je TIBSQL, coz je logicke.

Neni na to v IBX nejaky "prepinac" ?

diky

Tomas Bradle
t.bradle@worldonline.cz



----- Original Message -----
From: "Lebeda David" <david.lebeda@comarr.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, May 12, 2004 10:48 AM
Subject: Re: Ukladani NULL hodnot do databaze pri prazdnem TDBEdit poli


> > mam tu jeste jeden problemek. Mam TDBEdit komponenty napojene na
> > TIBDataset. V pripade editovani, kdyz se text z TDBEdit uplne vymaze
> > (predtim tam nejaky byl), nasledny POST ulozi do databaze hodnotu
> > NULL. Jedna se o hodnotu typu varchar.
> >
> > Nevi nekdo jak tohle nejak jednoduse vyresit ?
>
> Ahoj,
>
> to je asi dalsi z duvodu, proc k temhle vecem nepouzivat DBEdity. No ale
zkusim
> poradit tip - nevim, zda pomuze. Kdyz jsem se kdysi vrtal v TIBDatasetu,
zdalo se mi,
> ze pro IB je zaveden novy typ fieldu pro retezce. Normalne se pouziva
TStringField. IBX
> zavadi i typ TIBStringField a ten mozna zavadi to chovani, ktere
popisujes. Zkusil bych
> tedy namisto IBStringFieldu pouzit StringField. Nebo se podivat do
zdrojaku IBX, zda
> nekecam.
>
> David Lebeda
>
>


Odpovedá: Lebeda David

13. 5. 2004 6:58

> Tak jsem to predelal bez TDBEditu a vysledek je stejny: prazdny
> retezec v TIBStringField znamena NULL v databazi. Data prirazuju
> normalne stylem
>
> dsTest.insert;
> dsTestPRIJMENI.AsString:='Novak';
> dsTest.post;
>
> Pro TIBTabel i pro TIBDataset. Jedine co napise spravne prazdny
> retezec do databaze je TIBSQL, coz je logicke.
>
> Neni na to v IBX nejaky "prepinac" ?

Na prepinac neverim. Ve verzi, kterou mam ja (a ktera neni pravda uplne
nejnovejsi), je
v metode TIBCustomDataSet.InternalSetFieldData toto:

        if (Buffer = nil) or
           (Field is TIBStringField) and (PChar(Buffer)[0] = #0) then
          rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdIsNull := True

Coz znamena, ze pro prazdne retezce nahazuje priznak NULL. Reseni proto jsou:

1) Misto TIBStringField pouzivat TStringField. Coz by ale asi znamenalo fieldy
vytavret
rucne a to se ti asi nebude libit.

2) Nepouzivat fieldy k prirazovani hodnot. DBEdit i kod, ktery jsi uvedl
(Insert, uprava
fieldu, post) pracuji stejne a s IBDatasetem bez uprav se tomu nevyhnes.

3) Napsat si vlastni dataset, ktery by vysel z IBCustomDatasetu, ale metodu
InternalSetFieldData by implementoval lepe - je virtualni, teoreticky by to asi
slo. Ale ani
to by se ti jiste moc nelibilo.

4) Nejaka prasecinka typu, ze k projektu prilozis unitu IBCustomDataset a v ni
to primo
opravis.

5) Pro inserty a updaty nepouzivat vyse uvedeny postup, ale prime pouziti SQL
prikazu
insert nebo update. To jedine ti da snad jistotu, ze se provede opravdu jen to,
co v tom
prikazu vyslovene uvedes.

6) V uvahu by asi prichazelo i nejake osetreni v before triggerech na serveru -
ze kdyz
tam bude null, at do databaze zapise prazdny retezec...je-li to tedy vzhledem k

okolnostem pouzitelne.

7) Nejake jine reseni...???

David Lebeda